package org.aeon.gamechatnest.service;

import org.aeon.gamechatnest.dto.AuthorityVo;
import org.aeon.gamechatnest.exception.TargetIsAnEmptyException;
import org.aeon.gamechatnest.pojo.Role;
import org.aeon.gamechatnest.pojo.RoleAuthority;
import org.aeon.gamechatnest.pojo.RoleUser;

import java.util.List;
import java.util.Set;

/**
 * @author: MissingAeon
 * @date: 2024/5/10 18:05
 * @description: 角色服务
 */
public interface RoleService {

    /**
     * 添加角色到用户
     *
     * @param roleUser
     * @return
     */
    boolean addRoleToServerUser(RoleUser roleUser);

    /**
     * 添加默认角色到服务器
     *
     * @param role
     * @return
     */
    boolean addDefaultRoleToServer(Role role);

    /**
     * 添加权限到角色
     *
     * @param roleAuthority
     * @return
     */
    boolean addAuthorityToRole(RoleAuthority roleAuthority);

    /**
     * 发现用户于该服务器的权限
     *
     * @param userId
     * @param number
     * @return
     */
    Set<String> findAuthorityByUserIdAndServerId(Long userId, long number);

    /**
     * 删除该服务器所有角色
     * 包括角色和其他的联系
     *
     * @param serverId
     * @return
     */
    boolean removeServerRole(Long serverId);

    /**
     * 获取一个服务器所有角色
     *
     * @param serverId
     * @return
     */
    List<Role> findByServerId(Long serverId);

    /**
     * 获取一个角色
     *
     * @param roleId
     * @return
     */
    Role findById(Long roleId);

    /**
     * 获取一个角色存在
     *
     * @param roleId
     * @return
     */
    boolean isExist(Long roleId);


    /**
     * 根据角色id获取服务器id
     * 若为空抛出错误
     *
     * @param roleId
     * @return
     * @throws TargetIsAnEmptyException 若为空
     */
    Long findServerIdByRoleId(Long roleId) throws TargetIsAnEmptyException;

    /**
     * 新增一个角色
     *
     * @param role
     * @return
     */
    boolean save(Role role);

    /**
     * 修改应一个角色
     *
     * @param role
     * @return
     */
    boolean modify(Role role);

    /**
     * 删除一个角色
     *
     * @param roleId
     * @return
     */
    boolean remove(Long roleId);

    /**
     * 添加一个权限到角色
     *
     * @param roleAuthority
     * @return
     */
    boolean save(RoleAuthority roleAuthority);

    /**
     * 修改一个权限到角色
     *
     * @param roleAuthority
     * @return
     */
    boolean remove(RoleAuthority roleAuthority);

}
